Page Index
10 C 小程序订阅消息的使用
JL 于 2020-04-19 23:05:06 +08:00 修改了此页面
此文件含有模棱两可的 Unicode 字符

此文件含有可能会与其他字符混淆的 Unicode 字符。 如果您是想特意这样的,可以安全地忽略该警告。 使用 Escape 按钮显示他们。

JooLun版本

  • V2.8.2+

  • 订阅消息发送核心方法WxTemplateMsgServiceImpl.java

/**
 * 发送微信订阅消息
 * @param wxTemplateMsgSendDTO wxTemplateMsgSendDTO.useType、wxTemplateMsgSendDTO.page、wxTemplateMsgSendDTO.data、
 * @param wxUser wxUser.appId、wxUser.openId、
 */
@Override
public void sendWxTemplateMsg(WxTemplateMsgSendDTO wxTemplateMsgSendDTO, WxUser wxUser) {
    //查询订阅消息配置
    WxTemplateMsg wxTemplateMsg = baseMapper.selectOne(Wrappers.<WxTemplateMsg>lambdaQuery()
            .eq(WxTemplateMsg::getAppId,wxUser.getAppId())
            .eq(WxTemplateMsg::getEnable, CommonConstants.YES)
            .eq(WxTemplateMsg::getUseType,wxTemplateMsgSendDTO.getUseType()));
    if(wxTemplateMsg !=null){
        WxMaMsgService wxMaMsgService = WxMaConfiguration.getMaService(wxTemplateMsg.getAppId()).getMsgService();
        WxMaSubscribeMessage subscribeMessage = new WxMaSubscribeMessage();
        subscribeMessage.setToUser(wxUser.getOpenId());
        subscribeMessage.setTemplateId(wxTemplateMsg.getPriTmplId());
        subscribeMessage.setPage(wxTemplateMsgSendDTO.getPage());
        String content = wxTemplateMsg.getContent();
        //提取模板中的参数
        List<String> paramlist=new ArrayList<>();
        Pattern p = Pattern.compile("(?<=\\{)[^\\}]+");
        Matcher m = p.matcher(content);
        while(m.find()){
            paramlist.add(m.group().substring(1, m.group().length()));
        }
        List<WxMaSubscribeMessage.Data> listData = new ArrayList<>();
        HashMap<String, HashMap<String, String>> dataMap = wxTemplateMsgSendDTO.getData();
        paramlist.forEach(param -> {
            param = param.replace(".DATA","");
            if(dataMap.containsKey(param)){
                WxMaSubscribeMessage.Data data = new WxMaSubscribeMessage.Data();
                data.setName(param);
                data.setValue(dataMap.get(param).get("value"));
                listData.add(data);
            }
        });
        subscribeMessage.setData(listData);
        try {
            wxMaMsgService.sendSubscribeMsg(subscribeMessage);
        } catch (WxErrorException e) {
            if(!WxReturnCode.ERR_43101.getCode().equals(e.getError().getErrorCode()+"")){
                log.error(e.getMessage(),e);
            }
        }
    }
}
  • 使用订阅消息发送功能,比如:用户订单支付成功后要发消息通知用户,实现方法如下: 1、微信公众平台申请模板

2、将模板信息添加能JooLun后台,注模板ID、模板内容一定要和微信公众平台申请的模板对应

3、发送订阅消息

//小程序端获取授权,参考https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/subscribe-message.html
let tmplIds = ['wetwqtwqyqwywq','sgsdgsaetwetwqt']
wx.requestSubscribeMessage({
  tmplIds: tmplIds,
  success(res) {
    console.log(res)
  }
})
//后台发送订阅消息,参考https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/subscribe-message/subscribeMessage.send.html
try {
    WxTemplateMsgSendDTO wxTemplateMsgSendDTO = new WxTemplateMsgSendDTO();
    wxTemplateMsgSendDTO.setMallUserId(orderInfo.getUserId());
    wxTemplateMsgSendDTO.setUseType(ConfigConstant.WX_TMP_USE_TYPE_2);
    wxTemplateMsgSendDTO.setPage("pages/order/order-detail/index?id="+orderInfo.getId());
    HashMap<String, HashMap<String, String>> data = new HashMap<>();
    data.put("character_string1", (HashMap)JSONUtil.toBean("{\"value\": \""+orderInfo.getOrderNo()+"\"}",Map.class));
    DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH:mm");
    data.put("time4", (HashMap)JSONUtil.toBean("{\"value\": \""+orderInfo.getCreateTime().format(dtf)+"\"}",Map.class));
    String thing3 = orderInfo.getName();
    thing3 = thing3.length() > 40 ? thing3.substring(0,39) : thing3;
    data.put("thing3", (HashMap)JSONUtil.toBean("{\"value\": \""+thing3+"\"}",Map.class));
    data.put("amount2", (HashMap)JSONUtil.toBean("{\"value\": \""+orderInfo.getPaymentPrice()+"\"}",Map.class));
    data.put("amount5", (HashMap)JSONUtil.toBean("{\"value\": \""+orderInfo.getPaymentPrice()+"\"}",Map.class));
    wxTemplateMsgSendDTO.setData(data);
    feignWxTemplateMsgService.sendTemplateMsg(wxTemplateMsgSendDTO, SecurityConstants.FROM_IN);
}catch (Exception e){
    log.error("发送订阅消息发送出错:"+e.getMessage(), e);
}

4、相关说明

5、源码中的模板

订单支付成功模板

订单编号{{character_string1.DATA}}
订单金额{{amount2.DATA}}
商品名称{{thing3.DATA}}
下单时间{{time4.DATA}}
支付金额{{amount5.DATA}}
订单发货提醒

订单编号{{character_string1.DATA}}
商品详情{{thing2.DATA}}
快递单号{{character_string4.DATA}}
收货人{{name5.DATA}}
发货时间{{date10.DATA}}

按以上模板参数值申请的模板无需修改代码,如自己申请的模板参数和源码默认的不同,按实际情况改下代码即可